/**

This file is part of MaCI/GIMnet.

MaCI/GIMnet is free software: you can redistribute it and/or modify it 
under the terms of the GNU Lesser General Public License as published 
by the Free Software Foundation, either version 3 of the License, or 
(at your option) any later version.

MaCI/GIMnet is distributed in the hope that it will be useful, but WITHOUT 
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public 
License for more details.

You should have received a copy of the GNU Lesser General Public 
License along with GIMnet. (See COPYING.LESSER) If not, see 
<http://www.gnu.org/licenses/>.

**/
/** 
 * \file
 * \brief Demangler implementation
 * \author Antti Maula <antti.maula@tkk.fi>
 */
#include "demangler.hpp"
#include <string>
#include <string.h>

//*****************************************************************************
using namespace gim;
//*****************************************************************************
std::map<std::string, std::string> CDemangler::iMangledToDemangledMap;
//*****************************************************************************

std::string CDemangler::ConstructDemangledName(const std::string &aMangled)
{
  char buf[512] = "Unknown ";
  std::string cmd = "/usr/bin/c++filt -t " + aMangled;
  FILE *f = popen(cmd.c_str(), "r");
  if (f) {
    fgets(buf, sizeof(buf), f);
    int len = strlen(buf);
    buf[len-1] = '\0';
    fclose(f);
  }
  return std::string(buf);
}
//*****************************************************************************

const std::string CDemangler::GetDemangledName(const std::string &aMangledName)
{
  std::string result;
  std::map<std::string, std::string>::iterator iter = iMangledToDemangledMap.find(aMangledName);
  if (iter == iMangledToDemangledMap.end()) {
    result = ConstructDemangledName(aMangledName);
    iMangledToDemangledMap.insert(std::make_pair(aMangledName, result));
    
  } else {
    result = iter->second;
    
  }
  
  
  return result;
}
//*****************************************************************************
//*****************************************************************************
//*****************************************************************************
//*****************************************************************************
//*****************************************************************************
    
